import pandas as pd


def calculate_downside_strategy(initial_price: float = 2.37, add_shares: int = 1, down_percent: float = 5.0,
                                times: int = 10):
    """
    计算逐次下跌加仓策略的完整数据
    :param initial_price: 初始价格（默认2.37元）
    :param add_shares: 每次加仓份数（默认1份）
    :param down_percent: 每次下跌比例（默认5%）
    :param times: 下跌加仓次数（默认10次）
    :return: 包含所有数据的DataFrame
    """
    # 初始化数据列表
    data = []
    # 初始状态（第0阶段）
    current_price = initial_price
    total_shares = 1  # 初始持有1份
    total_cost = initial_price * 1  # 初始总成本
    avg_cost = total_cost / total_shares  # 持有均价
    holding_return = 0.0  # 初始收益率0%
    total_drop = 0.0  # 初始累计跌幅0%
    single_drop = "-"  # 初始无单次跌幅

    # 添加初始状态数据
    data.append({
        "阶段": "初始持仓",
        "当前价格（元）": round(current_price, 2),
        "累计持仓（份）": total_shares,
        "累计投入成本（元）": round(total_cost, 2),
        "持有成本（均价，元）": round(avg_cost, 2),
        "持有收益率": f"{holding_return:.2f}%",
        "单次跌幅": single_drop,
        "累计跌幅": f"{total_drop:.2f}%"
    })

    # 循环计算每次下跌加仓的数据
    for i in range(1, times + 1):
        # 1. 计算本次下跌后的价格（上一次价格 × (1 - 下跌比例)）
        last_price = current_price
        current_price = last_price * (1 - down_percent / 100)

        # 2. 计算加仓后的累计数据
        total_shares += add_shares  # 累计持仓增加
        add_cost = current_price * add_shares  # 本次加仓成本
        total_cost += add_cost  # 累计总成本
        avg_cost = total_cost / total_shares  # 更新持有均价

        # 3. 计算收益率和跌幅
        total_market_value = current_price * total_shares  # 当前总市值
        holding_return = (total_market_value - total_cost) / total_cost * 100  # 持有收益率
        single_drop = (current_price - last_price) / last_price * 100  # 单次跌幅
        total_drop = (current_price - initial_price) / initial_price * 100  # 累计跌幅

        # 4. 添加本次数据到列表
        data.append({
            "阶段": f"第{i}次下跌",
            "当前价格（元）": round(current_price, 2),
            "累计持仓（份）": total_shares,
            "累计投入成本（元）": round(total_cost, 2),
            "持有成本（均价，元）": round(avg_cost, 2),
            "持有收益率": f"{holding_return:.2f}%",
            "单次跌幅": f"{single_drop:.2f}%",
            "累计跌幅": f"{total_drop:.2f}%"
        })

    # 转换为DataFrame（方便打印和导出Excel）
    df = pd.DataFrame(data)
    return df


# ---------------------- 运行代码 ----------------------
if __name__ == "__main__":
    # 可自定义参数：初始价格、每次加仓份数、下跌比例、下跌次数
    df_result = calculate_downside_strategy(
        initial_price=2.37,  # 初始价格（可修改）
        add_shares=1,  # 每次加仓份数（可修改，如2份）
        down_percent=5.0,  # 每次下跌比例（可修改）
        times=20  # 下跌次数（可修改）
    )

    # 1. 打印表格到控制台
    print("下跌加仓策略完整清单：")
    print(df_result.to_string(index=False))  # 不显示索引列

    # 2. 导出为Excel文件（保存到当前文件夹）
    df_result.to_excel("下跌加仓策略清单.xlsx", index=False, engine="openpyxl")
    print("\n✅ Excel文件已保存为：下跌加仓策略清单.xlsx")